package ultweb.repository;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;

import ultweb.domain.Prodotto;


public class JdbcProdottoDao extends SimpleJdbcDaoSupport implements ProdottoDao {

    /** Logger for this class and subclasses */
    protected final Log logger = LogFactory.getLog(getClass());
    private String me="JdbcProdottoDao-";
  
	@Override
	public List<Prodotto> getProdottolist() {
		String foo=me +"getProdottolist- ";
		logger.info(foo+"BEGIN - prendo i prodotti!");
        List<Prodotto> prodotti = getSimpleJdbcTemplate().query(QueryConstants.GENERAL_PRODUCTS, new ProdottoMapper());
        logger.info(foo+"END");
        return prodotti;
	}
	
	public Prodotto getProdottoById(int id){
		String foo=me +"getProdottoById- ";
		logger.info(foo+"BEGIN - prendo il prodotto con id "+id);
        
		List<Prodotto> prodotti = getSimpleJdbcTemplate().query(QueryConstants.PRODUCTS_BY_ID+ id, new ProdottoMapper());
		logger.info(foo+"end - trovato prodotto == "+prodotti.get(0).toString());
		return prodotti.get(0);
	}

	@Override
	public void saveUpdateProdotto(Prodotto prod) {
		String foo=me +"saveProdotto- ";
		logger.info(foo+"salvo il Prodotto: " + prod.getNomeProdotto());
	        MapSqlParameterSource mapi=new MapSqlParameterSource();
	        mapi.addValue("nome", prod.getNomeProdotto())
	        	.addValue("marca", prod.getMarcaProdotto())
	        	.addValue("prezzo", prod.getPrezzoProdotto())
	        	.addValue("quantita", prod.getQuantita()+1)
	        	.addValue("pezzi_venduti", prod.getQuantita())
	        	.addValue("id", prod.getIdProdotto());
	        
	        logger.info(foo+" inizio parametri per il jdbc###\n"+mapi.getValues());
	        logger.info(foo+" fine parametri per il jdbc###\n");
	        int count = getSimpleJdbcTemplate().update(QueryConstants.updateQuery("PRODOTTO_HAIR"),mapi);
	            
	        logger.info(foo+" Rows affected: " + count);
		
	}
	private static class ProdottoMapper implements ParameterizedRowMapper<Prodotto> {

        public Prodotto mapRow(ResultSet rs, int rowNum) throws SQLException {
            Prodotto prod = new Prodotto();
            prod.setIdProdotto(rs.getInt("id"));
            prod.setNomeProdotto(rs.getString("nome"));
            prod.setMarcaProdotto(rs.getString("marca"));
            prod.setPrezzoProdotto(new Integer(rs.getInt("prezzo")));
            prod.setQuantita(new Integer(rs.getInt("quantita")));
            prod.setPezziVenduti(new Integer(rs.getInt("pezzi_venduti")));
            
            return prod;
        }

    }
	
	@Override
	public void saveInsertProdotto(Prodotto prod) {
		String foo=me +"saveProdotto- ";
		 logger.info(foo+"salvo il Prodotto: " + prod.getNomeProdotto());
	        MapSqlParameterSource mapi=new MapSqlParameterSource();
	        mapi.addValue("nome", prod.getNomeProdotto())
	        	.addValue("marca", prod.getMarcaProdotto())
	        	.addValue("prezzo", prod.getPrezzoProdotto())
	        	.addValue("quantita", prod.getQuantita())
	        	.addValue("pezzi_venduti", prod.getQuantita());
	        
	        logger.info(foo+" inizio parametri per il jdbc###\n"+mapi.getValues());
	        logger.info(foo+" fine parametri per il jdbc###\n");
	        int count = getSimpleJdbcTemplate().update(QueryConstants.insertQuery("PRODOTTO_HAIR"),mapi);
	        int id=getSimpleJdbcTemplate().queryForInt(QueryConstants.MAX_ID ,mapi);
	        logger.info(foo+" Rows affected: " + count);
		prod.setIdProdotto(id);
	}

	@Override
	public String saveSelectTable(Prodotto prod) {
		String tabella= "PRODOTTO_HAIR";
		MapSqlParameterSource mapi=new MapSqlParameterSource();
		mapi.addValue("nome", prod.getNomeProdotto()).addValue("marca", prod.getMarcaProdotto());
    	
		int cont=getSimpleJdbcTemplate().queryForInt(QueryConstants.getTableQuery(tabella),mapi);
		if (cont<1){
		 tabella= "PRODOTTO_MULTIMEDIA";
		  cont=getSimpleJdbcTemplate().queryForInt(QueryConstants.getTableQuery(tabella),mapi);
		  if (cont<1){
			  tabella= "PRODOTTO_PROFUMO";
			  cont=getSimpleJdbcTemplate().queryForInt(QueryConstants.getTableQuery(tabella),mapi);
			  if (cont<1){
				  tabella= "PRODOTTO_SKIN";
				  cont=getSimpleJdbcTemplate().queryForInt(QueryConstants.getTableQuery(tabella),mapi);
			  }
		  }
		}
		return tabella;
	}

	@Override
	public List<Prodotto> getProdottolist(String table) {
		String foo=me +"getProdottolist- ";
		logger.info(foo+"BEGIN - prendo i prodotti!");
        List<Prodotto> prodotti = getSimpleJdbcTemplate().query(QueryConstants.SIMPLE_SELECT + table, new ProdottoMapper());
        logger.info(foo+"END");
        return prodotti;
	}

}